package com.ymk.service.impl;

import com.alibaba.dubbo.config.annotation.Service;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.ymk.dao.TravelGroupDao;
import com.ymk.dao.TravelItemDao;
import com.ymk.pojo.TravelGroup;
import com.ymk.pojo.TravelItem;
import com.ymk.service.TravelGroupService;
import com.ymk.vo.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service(interfaceClass = TravelGroupService.class)
@Transactional
public class TravelGroupServiceImpl implements TravelGroupService {

    @Autowired
    private TravelGroupDao travelGroupDao;

    @Autowired
    private TravelItemDao travelItemDao;

    @Override
    public void add(TravelGroup travelGroup, Integer[] travelItemIds) {
        //1 新增跟团游，向t_travelgroup中添加数据，新增后返回新增的id
        travelGroupDao.add(travelGroup);
        //2 新增跟团游和自由行中间表t_travelgroup_travelitem新增数据(新增几条，
        // 由travelItemIds决定)
        setTravelGroupAndTravelItem(travelGroup.getId(),travelItemIds);
    }

    private void setTravelGroupAndTravelItem(Integer travelGroupId, Integer[] travelItemIds) {
        //新增几条数据，由travelItem的长度决定
        if(travelItemIds != null && travelItemIds.length>0){
            for (Integer travelItemId : travelItemIds) {
                //如果有多个参数使用map
                Map<String,Integer> map = new HashMap<>();
                map.put("travelGroup",travelGroupId);
                map.put("travelItem",travelItemId);
                travelGroupDao.setTravelGroupAndTravelItem(map);
            }
        }
    }

    @Override
    public PageResult findPage(Integer currentPage, Integer pageSize, String queryString) {
        //使用分页插件PageHelper，设置当前页，每页最多显示的记录数
        PageHelper.startPage(currentPage,pageSize);
        //响应分页插件的Page对象
        Page<TravelGroup> page = travelGroupDao.findPage(queryString);
        return new PageResult(page.getTotal(),page.getResult());
    }

    @Override
    public List<Integer> findTravelItemByTravelGroupId(Integer id) {
        return travelGroupDao.findTravelItemByTravelGroupId(id);
    }

    @Override
    public TravelGroup findById(Integer id) {
        return travelGroupDao.findById(id);
    }

    @Override
    public void edit(Integer[] traveltemIds, TravelGroup travelGroup) {
        //1.修改跟团游的基本信息
        travelGroupDao.edit(travelGroup);
        /**
         * 2.修改跟团游和自由行的中间表（先删除，在创建）
         * 主键的数据删除
         * 在新增页面选中的数据
         */
        //删除之前中间表的数据
        travelGroupDao.deleteTravelGroupAndTravelItemByTravelGroupId(travelGroup.getId());
        //在新增页面选中的数据
        setTravelGroupAndTravelItem(travelGroup.getId(),traveltemIds);
    }

    @Override
    public void delete(Integer id) {
        //在删除之前，先判断自由行的id,在中间表中是否存在数据
        long count = travelItemDao.findCountByTravelItemItemId(id);
        //中间表如果有数据，不要往后面执行，直接抛出异常
        //如果非要删除也可以，delete from t_travelgroup_travelitem where travelitem_id = 1
        if(count > 0){
            throw new RuntimeException("不允许删除");
        }
        travelGroupDao.delete(id);
    }

    @Override
    public List<TravelGroup> findAll() {
        return travelGroupDao.findAll();
    }
}

